/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Logica;

import autenticacion.Autenticacion;
import excepciones.UsuarioInvalido;
import excepciones.UsuarioYaExistente;
import java.util.LinkedList;
import gestorSimilar.Pagina;
import gestorSimilar.Tema;
import gestorSimilar.Gestor;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import model.Usuario;
import util.exceptions.PaginaNoExistenteException;

/**
 *
 * @author Nacho
 */
public class Acoplador {

    private String apiKey;
    private static Gestor gestor;
    private Usuario usuario;

    //private static Autenticacion aut;
    public Acoplador() {
        gestor = new Gestor("asdf");
    }

    private String regresaTablaTodasPaginas() {
        StringBuilder sb = new StringBuilder();

        LinkedList<Pagina> paginas = gestor.getTodasPaginas();

        sb.append("<table>\n");
        for (String strHeader : getHeaderPagina(true)) {
            sb.append(String.format("<th>%s</th>\n", strHeader));
        }

        for (Pagina pagina : paginas) {
            sb.append("<tr>\n");
            //sb.append(String.format("\t<td>%d</td>\n",pagina.getId()));
            sb.append(String.format("\t<td>%s</td>\n", pagina.getUrl()));
            sb.append(String.format("\t<td>%d</td>\n", pagina.getReputacion()));
            sb.append(String.format("\t<td><input type=\"radio\" name= \"urlPagina\" value=\"%s\"></td>\n", pagina.getUrl()));
            sb.append("</tr>\n");
        }
        sb.append("</table>");
        return sb.toString();
    }

    private LinkedList<String> getHeaderPagina(boolean conRB) {
        LinkedList<String> header = new LinkedList<String>();
        //header.add("ID");
        header.add("URL");
        header.add("Reputacion");
        if (conRB) {
            header.add("Ver detalle");
        }
        return header;
    }

    public String getPagina(String url) {
        StringBuilder sb = new StringBuilder();
        Pagina p = gestor.getPagina(url);
        LinkedList<Tema> temas = p.getTemas();
        String destino = "";
        sb.append(String.format("<h1>Detalle de pagina</h1>\n"));
        sb.append(String.format("<h2>ID</h2>\n"));
        sb.append(String.format("<p>%d</p>\n", p.getId()));
        sb.append(String.format("<h2>URL</h2>\n"));
        sb.append(String.format("<p>%s</p>\n", p.getUrl()));
        sb.append(String.format("<h2>Reputacion</h2>\n"));
        sb.append(String.format("<p>%d</p>\n", p.getReputacion()));
        sb.append(String.format("<form method=\"POST\" action=\"%s\">\n", destino));
        sb.append(String.format("<p>Nueva reputacion: <input type=\"text\" name=\"nuevaRep\"></p>\n"));
        sb.append(String.format("<h2>Temas</h2>\n"));
        sb.append(getTablaTodosTemas(true, temas));
        sb.append(String.format("</br>\n"));
        sb.append(String.format("<input type=\"submit\" name=\"submit\" value=\"Cambiar detalles de pagina\">\n"));
        sb.append(String.format("</br>\n"));
        sb.append(String.format("<input type=\"submit\" name=\"submit\" value=\"Eliminar\">\n"));
        sb.append(String.format("<input type=\"hidden\" name=\"urlPagina\" value=\"%s\">\n", p.getUrl()));
        sb.append(String.format("</form>\n"));

        return sb.toString();
    }

    private String getTablaTodosTemas(boolean cnCB, LinkedList<Tema> temasSelec) {

        StringBuilder sb = new StringBuilder();
        sb.append("<table>\n");
        for (String strHeader : getHeaderTema(true)) {
            sb.append(String.format("<th>%s</th>\n", strHeader));
        }
        for (Tema tema : gestor.getTodosTemas()) {
            sb.append("<tr>");
            sb.append(String.format("\t<td>%s</td>\n", tema.getNombre()));
            sb.append(String.format("\t<td><input type=\"checkbox\" name=\"temas\" value=\"%d,%s\"", tema.getId(), tema.getNombre()));
            if (temasSelec != null && temasSelec.contains(tema)) {
                sb.append(" checked=\"checked\" ");
            }
            sb.append("></td>\n</tr>\n");
        }
        sb.append("</table>\n");
        return sb.toString();
        //throw new UnsupportedOperationException();
    }

    public String getFormRegistro() {
        StringBuilder sb = new StringBuilder();
        String destino = "similar";
        sb.append(String.format("<h1>Registro</h1>"));
        sb.append(String.format("<form method=\"POST\" action=\"%s\">\n", destino));
        sb.append(String.format("\t<h2>Datos personales</h2>\n"));
        sb.append(String.format("\t<p>Nombre: <input type=\"text\" name=\"userNom\"></p>\n"));
        sb.append(String.format("\t<p>Apellido Paterno: <input type=\"text\" name=\"userApp\"></p>\n"));
        sb.append(String.format("\t<p>Apellido Materno: <input type=\"text\" name=\"userApm\"></p>\n"));
        sb.append(String.format("\t<p>Correo electonico: <input type=\"text\" name=\"email\"></p>\n"));
        sb.append(String.format("\t<p>Contrasena: <input type=\"password\" name=\"pass\"></p>\n"));
        sb.append(String.format("\t</br>\n"));
        sb.append(String.format("\t<h2>Temas preferidos</h2>\n"));
        sb.append(getTablaTodosTemas(true, null));
        sb.append(String.format("\t</br>\n"));
        sb.append(String.format("\t<input type=\"submit\" name=\"submit\" value=\"Registrarme\">\n"));
        sb.append(String.format("</form>\n"));
        return sb.toString();
    }

    private LinkedList<String> getHeaderTema(boolean cnCB) {
        LinkedList<String> header = new LinkedList<String>();
        //header.add("ID");
        header.add("Nombre");
        if (cnCB) {
            header.add("Seleccionar");
        }

        return header;
    }

    public String getSiguientePagina() {
        StringBuilder sb = new StringBuilder();
        sb.append(getHeaderPagPrincipal());
        try {
            Pagina sigPag = gestor.siguientePagina(usuario.getId());

            sb.append("<div style=\"margin: 0 auto; width:100%; height:100%; overflow: auto;\">");
            sb.append("<object type=\"text/html\" data=\"" + sigPag.getUrl() + "/\" style=\"width:100%; height:100%; margin:1%;\">");
            sb.append("</object></div>");
        } catch (PaginaNoExistenteException ex) {
            sb.append("<h1>Lo sentimos, ya no tenemos recomendaciones para ti...</h1>\n");
        }
        return sb.toString();
    }

    private String getHeaderPagPrincipal() {
        StringBuilder sb = new StringBuilder();
        sb.append("<div id=\"navbar\">");
        sb.append("<div id=\"logo\">");

        sb.append("<a href=\"#home\">");
        sb.append("<img src=\"images/logo.jpg\" width=\"153\" height=\"50\"></a>");

        sb.append("</div>");

        sb.append("<div id=\"menu\">");
        sb.append("<ul>");
        if (usuario.getPrivilegio().equals("1")) {
            /*sb.append("<li id=\"add\"><a href=\"?submit=add\">add</a></li>");
            sb.append("<li id=\"downvote\"><a href=\"?submit=downvote\">downvote</a></li>");
            sb.append("<li id=\"upvote\"><a href=\"?submit=upvote\" >upvote</a></li>");*/
            sb.append("<li id=\"add\"><a href=\"#add\">add</a></li>");
            sb.append("<li id=\"downvote\"><a href=\"#downvote\">downvote</a></li>");
            sb.append("<li id=\"upvote\"><a href=\"#upvote\" >upvote</a></li>");
            sb.append("<li id=\"siguiente\"><a href=\"?submit=siguiente\" >siguiente</a></li>");
        }
        sb.append("</ul>");
        sb.append("<br class=\"clear\">");
        sb.append("</div>");

        sb.append("</div>");

        return sb.toString();
    }

    public String getFormLogin() {
        StringBuilder sb = new StringBuilder();
        String destino = "similar";
        sb.append(String.format("<h1>Bienvenido a Similar</h1>"));
        sb.append(String.format("<form method=\"POST\" action=\"%s\">\n", destino));
        sb.append(String.format("\t<p>Usuario: <input type=\"text\" name=\"user\"></p>\n"));
        sb.append(String.format("\t<p>Contrasena: <input type=\"password\" name=\"pass\"></p>\n"));
        sb.append(String.format("\t</br>\n"));
        sb.append(String.format("\t<input type=\"submit\" name=\"submit\" value=\"Entrar\">\n"));
        sb.append(String.format("\t<input type=\"submit\" name=\"submit\" value=\"Registro\">\n"));
        sb.append(String.format("</form>\n"));
        return sb.toString();
        //throw new UnsupportedOperationException();
    }

    public String getFormTodasPaginas() {
        StringBuilder sb = new StringBuilder();
        String destino = "similar";
        sb.append(String.format("<form method=\"POST\" action=\"%s\">\n", destino));
        sb.append(String.format("\t</br>\n"));
        sb.append(String.format("\t<input type=\"submit\" name=\"submit\" value=\"Ver detalle de pagina\">\n"));
        sb.append(String.format("\t</br>\n"));
        sb.append(String.format("\t</br>\n"));
        sb.append(String.format("\t</br>\n"));
        sb.append(regresaTablaTodasPaginas());
        sb.append(String.format("</form>\n"));
        return sb.toString();
    }

    public String registroUsuario(HashMap<String, String> datos, HashMap<String, String> temas) {
        StringBuilder sb = new StringBuilder();
        String nom, app, apm, email, pass;
        nom = datos.get("userNom");
        app = datos.get("userApp");
        apm = datos.get("userApm");
        email = datos.get("email");
        pass = datos.get("pass");
        if (nom.equals("") || app.equals("") || email.equals("") || pass.equals("")) {
            sb.append(getFormRegistro());
            sb.append("</br>\n");
            sb.append("<p>Error: Favor de llenar todos los campos</p>\n");
            return sb.toString();
        }

        if (pass.length() < 8) {
            sb.append(getFormRegistro());
            sb.append("</br>\n");
            sb.append("<p>Error: La contraseña debe ser de al menos 8 caracteres</p>\n");
            return sb.toString();
        }

        if (temas == null) {
            sb.append(getFormRegistro());
            sb.append("</br>\n");
            sb.append("<p>Error: Favor de seleccionar al menos un tema</p>\n");
            return sb.toString();
        }
        Usuario u = registraUsuario(nom, app, apm, email, pass);
        if (u != null) {
            // Mandar info a gestor


            sb.append(getFormLogin());
            sb.append("</br>\n");
            sb.append("<p>Registro exitoso</p>\n");
            return sb.toString();
        } else {

            sb.append(getFormRegistro());
            sb.append("</br>\n");
            sb.append("<p>Error: El correo electronico ya se encuentra registrado</p>\n");
            return sb.toString();
        }

    }

    public String eliminaPagina(String url) {
        gestor.eliminarPagina(url);
        StringBuilder s = new StringBuilder();
        s.append("La página se ha eliminado con éxito<p>");
        s.append(getFormTodasPaginas());
        return s.toString();
    }

    public String autenticaUsuario(String email, String contrasena) {
        StringBuilder sb = new StringBuilder();
        if (!validaUsuario(email, contrasena)) {
            sb.append(getFormLogin());
            sb.append("</br>\n");
            sb.append("<p>Error: Usuario/Contraseña invalidos</p>\n");
            return sb.toString();
        }
        if (usuario.getPrivilegio().equals("1")) {
            sb.append(getSiguientePagina());
        }else{
            sb.append(getFormTodasPaginas());
        }
        
        return sb.toString();
    }

    private boolean validaUsuario(String email, String contrasena) {
        Usuario u;
        try {
            u = Autenticacion.autenticaUsuario(email, contrasena);
        } catch (UsuarioInvalido ex) {
            return false;
        }
        usuario = u;
        return true;
    }

    private Usuario registraUsuario(String nombre, String apPaterno, String apMaterno, String email, String contrasena) {
        Usuario u = null;
        try {
            u = Autenticacion.registraUsuario(nombre, apPaterno, apMaterno, email, contrasena);
        } catch (UsuarioYaExistente ex) {
            return null;
        }
        return u;
    }

    public static void main(String[] args) {
        Acoplador a = new Acoplador();
        //LinkedList<Tema> selec = gestor.getTemasPagina("http://yahoo.com");

        //System.out.println(a.getTablaTodosTemas(false, selec));

        System.out.println(a.validaUsuario("usuario@email.com", "1234"));

    }
}
